//! 抽象语法树（AST）定义
//! 
//! 定义中文汇编代码的抽象语法树节点

/// 汇编程序根节点
#[derive(Debug, Clone)]
pub struct Program {
    pub statements: Vec<Statement>,
}

/// 语句类型
#[derive(Debug, Clone)]
pub enum Statement {
    /// 指令语句
    Instruction(Instruction),
    /// 标签定义（标签名称，行号）
    Label(String, usize),
    /// 数据定义语句
    DataDefinition(DataDefinition),
    /// 注释（可选，用于保留原始注释信息）
    Comment(String),
}

/// 指令节点
#[derive(Debug, Clone)]
pub struct Instruction {
    /// 指令名称（中文，如"加"、"减"等）
    pub name: String,
    /// 操作数列表
    pub operands: Vec<Operand>,
    /// 行号（用于错误报告）
    pub line: usize,
}

/// 操作数类型
#[derive(Debug, Clone)]
pub enum Operand {
    /// 寄存器（如 "累加器", "基址" 等，中文表示）
    Register(String),
    /// 立即数（数字）
    Immediate(i64),
    /// 内存地址
    Memory(MemoryOperand),
    /// 标签引用（用于跳转指令）
    Label(String),
}

/// 内存操作数
#[derive(Debug, Clone)]
pub struct MemoryOperand {
    /// 基址寄存器（可选）
    pub base: Option<String>,
    /// 索引寄存器（可选）
    pub index: Option<String>,
    /// 比例因子（可选，1, 2, 4, 8）
    pub scale: Option<u8>,
    /// 偏移量（可选）
    pub displacement: Option<i64>,
}

impl MemoryOperand {
    /// 创建简单内存操作数（仅偏移量）
    pub fn simple(displacement: i64) -> Self {
        Self {
            base: None,
            index: None,
            scale: None,
            displacement: Some(displacement),
        }
    }
}

/// 数据定义语句
#[derive(Debug, Clone)]
pub struct DataDefinition {
    /// 标签名称（可选）
    pub label: Option<String>,
    /// 数据类型
    pub data_type: DataType,
    /// 数据值列表
    pub values: Vec<DataValue>,
    /// 行号（用于错误报告）
    pub line: usize,
}

/// 数据类型
#[derive(Debug, Clone, PartialEq)]
pub enum DataType {
    /// 定义字节 (DB)
    Byte,
    /// 定义字 (DW)
    Word,
}

/// 数据值
#[derive(Debug, Clone)]
pub enum DataValue {
    /// 立即数值
    Immediate(i64),
    /// 字符串字面量（使用中文双引号）
    String(String),
}

